package chapter_19


class Xiajie[+T](private val fruitList: List[T]) {
  def append[U >: T](x: U) =
    // 定义了T为U的下界，现在U必须是T的超类型。
    // append的参数现在变成类型U而不是类型T，而方法的返回值现在也变为
    // Queue[U]，取代了Queue[T]。
    new Xiajie[U] (x :: fruitList) // ...

  def getFruitList = fruitList
}


class Fruit(private val name: String) {
  override def toString: String = name
}
class Apple(name: String) extends Fruit(name)
class Orange(name: String) extends Fruit(name)


object Xiajie {

  def main(args: Array[String]): Unit = {
    /*
    Apple和Orange是Fruit的两个子类。
    通过Xiajie类的定义，可以把Orange对象加入到Xiajie[Apple]，
    而返回的结果为Xiajie[Fruit]类型。
     */
    val x = new Xiajie[Apple](List(new Apple("apple")))
    val newX = x.append(new Orange("orange"))
    newX.getFruitList.foreach(println)
  }
}